2. 图像变换
2. image translate
图像变化
import cv im = cv.LoadImageM("building.jpg") print type(im) #<type 'cv.cvmat'> cv.SaveImage("foo.png", im)
图像大小变换
为了得到合适大小的图片,需要使用 Resize 函数
import cv original = cv.LoadImageM("building.jpg") thumbnail = cv.CreateMat(original.rows / 10, original.cols / 10, cv.CV_8UC3) cv.Resize(original, thumbnail)
计算拉普拉斯算子 Laplacian
import cv im = cv.LoadImageM("building.jpg", 1) dst = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_16S, 3) laplace = cv.Laplace(im, dst) cv.SaveImage("foo-laplace.png", dst)
得到优良特征跟踪
得到图像10个最好特征,使用 GoodFeaturesToTrack 函数
import cv img = cv.LoadImageM("building.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE) eig_image = cv.CreateMat(img.rows, img.cols, cv.CV_32FC1) temp_image = cv.CreateMat(img.rows, img.cols, cv.CV_32FC1) for (x,y) in cv.GoodFeaturesToTrack(img, eig_image, temp_image, 10, 0.04, 1.0, useHarris = True): print "good feature at", x,y
输出:
good feature at 198.0 514.0 good feature at 791.0 260.0 good feature at 370.0 467.0 good feature at 374.0 469.0 good feature at 490.0 520.0 good feature at 262.0 278.0 good feature at 781.0 134.0 good feature at 3.0 247.0 good feature at 667.0 321.0 good feature at 764.0 304.0
GetSubRect 使用
GetSubRect 返回图像的一个矩形部分,其中不涉及任何数据拷贝。
import cv img = cv.LoadImageM("building.jpg") sub = cv.GetSubRect(img, (60, 70, 32, 32)) # sub is 32x32 patch within img cv.SetZero(sub) # clear sub to zero, which also clears 32x32 pixels in img
使用 CreateMat ,访问数据元素
>>> import cv >>> mat = cv.CreateMat(5, 5, cv.CV_32FC1) >>> cv.Set(mat, 1.0) >>> mat[3,1] += 0.375 >>> print mat[3,1] 1.375 >>> print [mat[3,i] for i in range(5)] [1.0, 1.375, 1.0, 1.0, 1.0]
ROS 图像转换 OpenCV
详见此教程:使用 CvBridge 函数,在 ROS 图像和 Opencv 图像间转换。
PIL 图像转换为 OpenCV
( 关于PIL详细内容,见PIL手册 )
>>> import Image, cv >>> pi = Image.open('building.jpg') # PIL image >>> cv_im = cv.CreateImageHeader(pi.size, cv.IPL_DEPTH_8U, 3) >>> cv.SetData(cv_im, pi.tostring()) >>> print pi.size, cv.GetSize(cv_im) (868, 600) (868, 600) >>> print pi.tostring() == cv_im.tostring() True
OpenCV 转换为 PIL Image
>>> import Image, cv >>> cv_im = cv.CreateImage((320,200), cv.IPL_DEPTH_8U, 1) >>> pi = Image.fromstring("L", cv.GetSize(cv_im), cv_im.tostring()) >>> print pi.size (320, 200)
NumPy 与 OpenCV
使用数组函数,在 Numpy 中操作 OpenCV CvMat
>>> import cv, numpy >>> mat = cv.CreateMat(3, 5, cv.CV_32FC1) >>> cv.Set(mat, 7) >>> a = numpy.asarray(mat) >>> print a [[ 7. 7. 7. 7. 7.] [ 7. 7. 7. 7. 7.] [ 7. 7. 7. 7. 7.]]
在Opencv中使用Numpy数组
>>> import cv, numpy >>> a = numpy.ones((480, 640)) >>> mat = cv.fromarray(a) >>> print mat.rows 480 >>> print mat.cols 640
同样,大部分 Opencv 函数可以兼容 Numpy 数组 , 例如:
>>> picture = numpy.ones((640, 480)) >>> cv.Smooth(picture, picture, cv.CV_GAUSSIAN, 15, 15)
给定一个2D数组,fromarray 函数(或如上所示的隐式方法)返回一个同样大小的单通道 CvMat 数据 。对于3D数组 , 返回多通道的 CvMat 大小的数据 。
另外 , 使用 fromarray 的 allowND 选项可以返回 CvMatND 类型 。
OpenCV 转为 pygame
把 Opencv 图像转化为 pygame 格式 :
>>> import pygame.image, cv >>> src = cv.LoadImage("lena.jpg") >>> src_rgb = cv.CreateMat(src.height, src.width, cv.CV_8UC3) >>> cv.CvtColor(src, src_rgb, cv.CV_BGR2RGB) >>> pg_img = pygame.image.frombuffer(src_rgb.tostring(), cv.GetSize(src_rgb), "RGB") >>> print pg_img <Surface(512x512x24 SW)>
OpenCV 与 OpenEXR
使用 OpenEXR 的 python 接口能够创建一个简单的图像显示 :
import OpenEXR, Imath, cv filename = "GoldenGate.exr" exrimage = OpenEXR.InputFile(filename) dw = exrimage.header()['dataWindow'] (width, height) = (dw.max.x - dw.min.x + 1, dw.max.y - dw.min.y + 1) def fromstr(s): mat = cv.CreateMat(height, width, cv.CV_32FC1) cv.SetData(mat, s) return mat pt = Imath.PixelType(Imath.PixelType.FLOAT) (r, g, b) = [fromstr(s) for s in exrimage.channels("RGB", pt)] bgr = cv.CreateMat(height, width, cv.CV_32FC3) cv.Merge(b, g, r, None, bgr) cv.ShowImage(filename, bgr) cv.WaitKey()